//
// Created by Asus on 2025/6/1.
//

#include <iostream>
#include <bits/ostream.tcc>
using namespace std;

//圆周率
const double PI = 3.14;

//1、封装的意义
//将属性和行为作为一个整体，用来表现生活中的事物

//封装一个圆类，求圆的周长
//class代表设计一个类，后面跟着的是类名
class Circle {
public: //访问权限  公共的权限
    //属性
    int m_r; //半径
    //行为
    //获取到圆的周长
    double calculateZC() {
        //2 * pi  * r
        //获取圆的周长
        return 2 * PI * m_r;
    }
};

void demo01() {
    Circle c;
    c.m_r = 10;
    cout << "calculateZC(): " << c.calculateZC() << endl;
}

class Student {
public:
    string m_name;
    int m_id;

    void setName(string name) {
        m_name = name;
    }

    void setID(int id) {
        m_id = id;
    }

    void showStudent() {
        cout << "name:" << m_name << " id: " << m_id << endl;
    }
};

void demo02() {
    Student stu;
    stu.setName("德玛西亚");
    stu.setID(250);
    stu.showStudent();
}

//三种权限
//公共权限  public     类内可以访问  类外可以访问
//保护权限  protected  类内可以访问  类外不可以访问
//私有权限  private    类内可以访问  类外不可以访问
class Person {
    //姓名  公共权限
public:
    string m_Name;

    //汽车  保护权限
protected:
    string m_Car;

    //银行卡密码  私有权限
private:
    int m_Password;

public:
    void func() {
        m_Name = "张三";
        m_Car = "拖拉机";
        m_Password = 123456;
    }
};

void demo03() {
    Person p;
    p.m_Name = "李四";
    //p.m_Car = "奔驰";  //保护权限类外访问不到
    //p.m_Password = 123; //私有权限类外访问不到
}

class C1 {
    int m_A; // 默认private
};

struct C2 {
    int m_A; //默认是公共权限
};

void demo04() {
    C1 c1;
    // c1.m_A = 10; //错误，访问权限是私有
    C2 c2;
    c2.m_A = 10; //正确，访问权限是公共
}

class Person2 {
private:
    string m_Name; //可读可写  姓名

    int m_Age; //只读  年龄

    string m_Lover; //只写  情人
public:
    void setName(string name) {
        m_Name = name;
    }

    string getName() {
        return m_Name;
    }

    int getAge() {
        return m_Age;
    }

    void setAge(int age) {
        if (age < 0 || age > 150) {
            cout << "你个老妖精!" << endl;
            return;
        }
        m_Age = age;
    }

    //情人设置为只写
    void setLover(string lover) {
        m_Lover = lover;
    }
};

void demo05() {
    Person2 p;
    //姓名设置
    p.setName("张三");
    cout << "姓名： " << p.getName() << endl;
    //年龄设置
    p.setAge(50);
    cout << "年龄： " << p.getAge() << endl;
    p.setLover("苍井");
    //cout << "情人： " << p.m_Lover << endl;  //只写属性，不可以读取
}

int main() {
    // demo01();
    // demo02();
    // demo03();
    demo05();
    return 0;
}
